package com.woniu.adminservice.service.impl;

import com.woniu.adminservice.dao.RolesMenusDao;
import com.woniu.adminservice.dao.UsersRoleDao;
import com.woniu.adminservice.entity.Roles;
import com.woniu.adminservice.dao.RolesDao;
import com.woniu.adminservice.entity.RolesMenus;
import com.woniu.adminservice.exception.RolesServiceExceptipn;
import com.woniu.adminservice.service.RolesService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service("rolesService")
public class RolesServiceImpl implements RolesService {
    @Resource
    private RolesDao rolesDao;
    @Resource
    private RolesMenusDao rolesMenusDao;

    @Resource
    private UsersRoleDao usersRoleDao;

    @Override
    public Roles queryById(Integer id) {
        return rolesDao.queryById(id);
    }

    @Override
    public List<Roles> queryAllByLimit(int offset, int limit) {
        return rolesDao.queryAllByLimit(offset, limit);
    }
   
     @Override
    public List<Roles> findAll() {
        return rolesDao.findAll();
    }

    @Override
    public Roles insert(Roles roles) {
        rolesDao.insert(roles);
        return roles;
    }

    @Override
    public Roles update(Roles roles) {
        rolesDao.update(roles);
        return queryById(roles.getId());
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:根据id删除角色前 需要判断角色是否被使用
     *  使用中则无法删除
     * return:
     */
    @Override
    public void deleteById(Integer id) {
        //查询角色是否被使用
        List<RolesMenus> rolesMenus = usersRoleDao.selectByRoleId(id);
        if (rolesMenus.size()>0){
            throw new RolesServiceExceptipn("该角色使用中,无法删除!");
        }else {
            rolesDao.deleteById(id);
            //删除该角色相关权限
            rolesMenusDao.deleteByRoleId(id);
        }
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:分页查询角色列表
     * return:
     */
    @Override
    public List<Roles> selectAllByPage(Integer currentPage, Integer pageSize) {
        return rolesDao.selectAllByPage(currentPage,pageSize);
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:根据角色名称判断角色是否重复
     * return:
     */
    @Override
    public Roles findByRoleName(String roleName) {
        return rolesDao.findByRoleName(roleName);
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description: 新增角色信息  同时向中间表添加相应数据
     * return:
     */
    @Override
    public void saveRole(Roles roles, List<Integer> keys) {
        rolesDao.insert(roles);
        //
        List<RolesMenus> list = new ArrayList();
        for (Integer menuId : keys) {
            RolesMenus rolesMenus = new RolesMenus();
            rolesMenus.setMenuId(menuId);
            rolesMenus.setRoleId(roles.getId());
            list.add(rolesMenus);
        }
        //向角色权限中间表添加数据
        rolesMenusDao.saveRolesMenus(list);
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description: 根据角色id进行批量删除 有角色被使用则无法删除
     * return:
     */
    @Override
    public void deleteByIds(List roleIds) {
        //查询要删除的角色是否被使用
        List<RolesMenus> rolesMenus = rolesMenusDao.selectByRoleIds(roleIds);
        if (rolesMenus.size()>0){
            throw new RolesServiceExceptipn("删除失败,有角色正在在被使用");
        }else{
            //批量删除角色
            rolesDao.deleteByIds(roleIds);
            //批量删除角色权限中间表信息
            rolesMenusDao.deleteByIds(roleIds);
        }

    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:根据id查询角色信息
     * return:
     */
    @Override
    public Roles selectById(Integer id) {
        return rolesDao.selectRolesById(id);
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:
     * return:
     */
    @Override
    public Boolean checkRoleName(Roles roles) {
        //根据角色名判断角色是否重复
        Roles role = rolesDao.findByRoleName(roles.getRoleName());
        if(role == null){
            return false;
        }
        if(role.getId().equals(roles.getId())){
            return false;
        }
        return true;
    }

    /**
     * Auther: 杨世民  <br/>
     * Date: :  <br/>
     * Description:更新角色信息  同时更新该角色的权限信息
     * return:
     */
    @Override
    public void updateRoleById(Roles roles, List<Integer> menuIDs) {
        rolesDao.update(roles);
        //将该角色原有的权限删除
        rolesMenusDao.deleteByRoleId(roles.getId());
        //更新角色权限信息
       List<RolesMenus> list = new ArrayList();
        for (Integer menuId : menuIDs) {
            RolesMenus rolesMenus = new RolesMenus();
            rolesMenus.setMenuId(menuId);
            rolesMenus.setRoleId(roles.getId());
            list.add(rolesMenus);
        }
        rolesMenusDao.saveRolesMenus(list);
    }

}